package demo.generic;

/**
 * 测试泛型的使用
 * 泛型：T代表Type、E代表Element、K代表key、V代表value、N代表Number
 */
public class GenericDemo<T>{
	// 设置类型下限：? 必须 是Integer的父类或者Integer类（简单来说，？类 >= Integer类）
	public void test1(GenericDemo<? super Integer> a){}

	// 设置类型上限：? 必须 是Number的子类或者Number类（简单来说，？类 <= Number类）
	public void test2(GenericDemo<? extends Number> a){}

	// 泛型方法（不受制与类中声明的参数类型T）
	public <E> void test4(E[] elements){}

	// 其他普通方法（受制于类中声明参数类型T）
	public T test3(T t){ return t;}

	public static void main(String[] args) {
		// 1、随便创建1个对象，用来调用方法
		GenericDemo<Integer> demo = new GenericDemo<>();

		// 2、泛型的上限、下限测试
		demo.test1(new GenericDemo<>());
//		demo.test1(new GenericDemo<Integer>());//通过:和上面效果一致相当于demo.test1(new GenericDemo<>());
		demo.test1(new GenericDemo<Number>());
//		demo.test1(new GenericDemo<Double>());//编译不通过：Double的子类不是Integer
		demo.test1(new GenericDemo<Object>());

		demo.test2(new GenericDemo<>());
//		demo.test2(new GenericDemo<Number>());//通过：和上面效果一致
		demo.test2(new GenericDemo<Double>());
		demo.test2(new GenericDemo<Float>());
//		demo.test2(new GenericDemo<Object>());//编译不通过：Object的父类不是Number

		// 3、普通方法的测试
//		demo.test3("string");
		demo.test3(1);

		// 4、泛型方法的测试（都可以通过编译）
		Integer[] ints = {1,3,2,4};
		Character[] chars = {'1','2'};
		String[] strs = {"1","2"};
		demo.test4(ints);
		demo.test4(chars);
		demo.test4(strs);
	}
}
